package main

/*
go语言实现下列功能：
定义一些初始值：
username='root'
passwd='123456'
balance=1000
实现一个简单的atm存取款系统
1.登录成功才能进入系统
	选择：1.存钱
	     2，取钱  -- 注意取钱金额不能大于余额
	     3.查询余额
	     4.退出整个系统
2.登录失败有三次重试机会，超过三次就退出
3.把上述提到的所有功能封装成函数
*/
import (
	"fmt"
	"strconv"
)

// 登录函数
func login(username, passwd string) bool {
	var username1 string
	fmt.Println("欢迎使用ATM系统！")
	fmt.Println("请输入用户名：")
	fmt.Scan(&username1)
	var passwd1 string
	fmt.Println("请输入密码：")
	fmt.Scan(&passwd1)
	if username1 == username && passwd1 == passwd {
		return true //只有用户名密码均正确才能登录成功
	} else {
		return false
	}
}

// 存款函数
func deposit(balance *int, amount int) { //定义一个balance指针，通过引用传递实时返回余额的值，下同
	*balance += amount
	fmt.Printf("存款成功，当前余额为 %d\n", *balance)
}

// 取款函数
func withdraw(balance *int, amount int) {
	if amount > *balance { //取款金额不能大于余额
		fmt.Println("余额不足，无法取款")
		return
	} else {
		*balance -= amount
		fmt.Printf("取款成功，当前余额为 %d\n", *balance)
	}
}

// 查询余额函数
func checkBalance(balance *int) {
	fmt.Printf("当前余额为 %d\n", *balance)
}
func main() {
	var n, choice int
	balance := 1000
	username := "root"
	passwd := "123456"
	n = 3       // 设置重试次数为3次
	for n > 0 { // 循环进行登录尝试，直到重试次数用完或登录成功
		if login(username, passwd) { // 尝试登录，调用login函数
			break // 登录成功，跳出循环
		} else { // 登录失败，输出提示信息并减少重试次数
			fmt.Println("登录失败，还有 " + strconv.Itoa(n-1) + " 次重试机会")
			n--
		}
		if n == 0 { // 重试次数用完，退出程序
			fmt.Println("超过三次重试机会，程序退出")
			return
		}
	}
	fmt.Println("登录成功！")
	for {
		fmt.Println("请选择操作选项：")
		fmt.Scan(&choice) // 手动输入选择
		switch choice {   // 使用 switch来处理用户的选择
		case 1: // 存款操作
			var amount int
			fmt.Println("请输入存款金额：")
			fmt.Scan(&amount)
			deposit(&balance, amount) //传递balance的地址给deposit函数，调用deposit函数进行存款操作
		case 2: //取款操作
			var amount int
			fmt.Print("请输入取款金额：")
			fmt.Scan(&amount)          //
			withdraw(&balance, amount) //传递balance的地址给withdraw函数，调用withdraw函数进行取款操作
		case 3: // 查询余额操作
			checkBalance(&balance) //传递balance的地址给checkBalance函数，调用checkBalance函数查询当前余额
		case 4: // 退出系统
			fmt.Println("感谢使用ATM系统，再见！")
			return
		default: // 如果用户输入的不是1、2、3、4，则输出错误提示信息并重新输入
			fmt.Println("选择无效，请重新输入")
		}
	}
}
